#ifndef __WEBPAGEQUERY__YR__
#define __WEBPAGEQUERY__YR__

#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <utility>
#include <set>
#include "../include/WebPageSearcher.h" 
#include "../include/SplitTool.h"
#include "../include/WebPage.h" 

// #include <nlohmann/json.hpp>

// using json = nlohmann::json;
using std::string;
using std::unordered_map;
using std::unordered_set;
using std::vector;
using std::pair;
using std::set;
using std::map;

class WebPage;

// 网页查询类
class WebPageQuery {
public:
    // 构造函数
    WebPageQuery();

    // 执行查询，返回结果
    string doQuery(const string& str,SplitToolCppJieba&  jieba);
    void getresult(vector<string> &result_str);
private:
    //SplitToolCppJieba&  _jieba;                                   // Jieba 分词库对象
    unordered_map<int, WebPage> _pageLib;                       // 网页库
    unordered_map<int, pair<int, int>> _offsetLib;              // 偏移库
    unordered_map<string, set<pair<int, double>>> _invertIndexTable;  // 倒排索引表
    
    set<int> _commonId;//求不同关键字都有的id，及id的交集
    
    vector<pair<int, double>> _similarityVec; // 存储文档ID和相似度的向量,相似度越高的下标越小
    //map<string, int> documentCollection;         // 保存每篇文档的所有词语和词频，不包括停用词
    int _count=0;//统计文档总数

    // 加载库文件,直接调用守睿和范成凯线下生成的三个.dat库
    void loadLibrary();

    double calculateIDF(const std::string& word);

    // 计算查询词的权重值
    vector<double> getQueryWordsWeightVector(const vector<string>& queryWords);

    //根据分词后的queryWords得到包含文章关键词的倒排索引库内容，文章ID等
    bool setInvertIndexTable(const vector<string>& queryWords, const string &filename);

    //求不同关键字都有的id，及id的交集
    void  setCommonId();

    //vector<pair<int, vector<double>>>& resultVec生成这个，方便后面进行排名
    void setReseltVec(vector<pair<int, vector<double>>>& resultVec);
    
    //根据文章id和偏移库内容，确定文章位置
    void setOffSetLib(const string &filename);

    //确定文章位置后，利用网页库，生成对应文章的WebPage对象
    void setPageLib(const vector<string>& queryWords,const string &filename);

    //余弦相似度
    void cosineSimilarity(vector<double>& x,vector<pair<int, vector<double>>>& resultVec);
    
    // 执行查询
    bool executeQuery(const vector<string>& queryWords, vector<pair<int, vector<double>>>& resultVec);

    // 创建 JSON 格式的查询结果
    string createJson(const vector<int>& docIdVec, const vector<string>& queryWords);

    // 返回无结果的查询响应
    string returnNoAnswer();



    //mysql查询函数
    bool setInvertIndexTableMysql(const vector<string>& queryWords);
    void setPageMysql(const vector<string>& queryWords);

    void setPageOnlyMysql(set<int>& _commonId,const vector<string>& queryWords);

    //mysql的中间函数
    void setOffSetLibMysql(const string &filename);
    unordered_map<int, pair<int, int>> _offsetLibMysql;              // 偏移库
    map<int, vector<string>> _mp;

};

#endif